home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 090 / timings.arc / TIMERR02.ASM < prev    next >
Assembly Source File  |  1986-01-18  |  3KB  |  106 lines

  1.     title    TIMERR02 -- Read High Resolution Timer Information
  2.     page    60,120
  3.  
  4.     name    TIMERR02    ; module
  5.  
  6. comment |         Module Specifications
  7.  
  8. Copyright: None.
  9.  
  10. Environment: IBM PC, tested under DOS 2.0.
  11.  
  12. Segmentation: Program segment CODE, public, byte aligned, class ''.
  13.  
  14. Public symbols and external references: See Symbols section of listing.
  15.  
  16. Link requirements: None, standalone subroutine.
  17.  
  18. Program derived from: None.
  19.  
  20. Original code by: Bob Smith and Tom Puckett, October 1983.
  21.  
  22. Modifications by: None.
  23.  
  24.  
  25.             Procedure Specifications
  26.  
  27. Public Procedure TIMERR02 -- High Resolution Timer Read Routine
  28.  
  29.     This is a subroutine to return high resolution timing information
  30.     obtained from the BIOS TIMER_LOW and TIMER_HIGH fields, extended
  31.     with low order information obtained from the current residual count
  32.     of Counter 0 of the 8253.  (See routine TIMERS01 for initializing
  33.     Counter 0.)
  34.  
  35.     Assumptions: Counter 0 running in Mode 2, with full count of 65536.
  36.              Locations of BIOS TIMER_LOW and TIMER_HIGH fields are
  37.             40:6C and 40:6E respectively.
  38.  
  39.     Linkage: Near call and return.
  40.  
  41.     Arguments: None.
  42.  
  43.     Effects: None.
  44.  
  45.     Results: Flags destroyed.
  46.          AX = TIMER_HIGH.
  47.          BX = TIMER_LOW.
  48.          CX = low order extension obtained by reading 8253.
  49.  
  50.     Return conditions: None.
  51.  
  52.     Limitations: None.
  53.  
  54. |
  55.     page
  56.  
  57. bios_data_seg    equ    40h
  58. bios_data    segment at 40h
  59.         org    6ch
  60. timer_low    dw    ?
  61. timer_high    dw    ?
  62. bios_data    ends
  63.  
  64. code    segment    public byte
  65.     assume    cs:code
  66.  
  67. ; equates....
  68.  
  69. timer_0        equ    40h    ; 8253 channel 0 port
  70. timer_ctl    equ    43h    ; 8253 control port
  71.  
  72. timer_0_latch    equ    00h    ; 8253 command to save channel 0 current count
  73.  
  74.  
  75.     public    TIMERR02
  76. TIMERR02 proc    near        ; see specifications at head of listing
  77.  
  78.     push    ds
  79.     mov    ax,bios_data_seg    ; get pointer to BIOS data area
  80.     mov    ds,ax
  81.     assume    ds:bios_data
  82.  
  83.     mov    al,timer_0_latch    ; timer 0, latch
  84.  
  85.     cli                ; hold off interrupts while fetching data
  86.     out    timer_ctl,al    ; latch current count in 8253
  87.     mov    bx,timer_low    ; get matching values...
  88.     mov    cx,timer_high
  89.     in    al,timer_0    ; read in low order byte
  90.     mov    ah,al        ; tuck it out of the way
  91.     nop            ; insure 5 clocks for 8253 recovery time
  92.     in    al,timer_0    ; read in high order byte
  93.     sti                ; allow interrupts again
  94.  
  95.     xchg    ah,al        ; get in right order in register
  96.     neg    ax        ; get up count from down
  97.     xchg    ax,cx        ; return in common register order
  98.     pop    ds        ; restore
  99.     ret
  100.  
  101. TIMERR02 endp
  102.  
  103. code    ends            ; end code segment
  104.  
  105.      end            ; end module
  106.